#include <REGX52.H>

sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;


/**
  * @brief  I2C开始
  * @param  无
  * @retval 无
  */
void I2C_Start(void)
{
	I2C_SDA=1;
	I2C_SCL=1; //起始信号是在SCL=1时将SDA由1→0，需要先保证SDA在变化前为高电平，但是SDA的状态不确定，所以先将SDA=1再置SCL=1
	I2C_SCL=0;
	I2C_SCL=0;
}


/**
  * @brief  I2C停止
  * @param  无
  * @retval 无
  */
void I2C_Stop(void)
{
	I2C_SDA=0;
	I2C_SCL=1;
	I2C_SDA=1;
	//SCL不置0是因为停止是跟在两种应答后面的，而无论哪种应答结束的时候SCL都已经是0了(SCL在默认空闲状态下为0)
}


/**
  * @brief  I2C发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void I2C_SendByte(unsigned char Byte)  //写入内存的不需要返回值
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		I2C_SDA=Byte&(0x80>>i);  //从最高位开始读取数据
		I2C_SCL=1;
		I2C_SCL=0;  //由于单片机翻转需要1ms左右，大于程序运行时间，所以可以不添加延时
	}

}


/**
  * @brief  I2C接收一个字节
  * @param  无
  * @retval 接收到的一个字节数据
  */
unsigned char I2C_ReceiveByte(void)  //从内存中读出的需要返回值
{
	unsigned char i,Byte=0x00;
	I2C_SDA=1;  //开始接受数据前需要释放总线
	//但是SDA不都一直是1，主机需要接受从机通过SDA传输的数据，所以SDA是变化的
	for(i=0;i<8;i++)
	{
		I2C_SCL=1;  //开始读取数据
		if(I2C_SDA){Byte|=(0x80>>i);}  //从高位开始发送数据
		I2C_SCL=0;
	}
	return Byte;
}


/**
  * @brief  I2C发送应答
  * @param  AckBit 应答位，0为应答，1为非应答
  * @retval 无
  */
void I2C_SendAck(unsigned char AckBit) 
{
	I2C_SDA=AckBit;  //给0即应答，给1即不应答
	I2C_SCL=1;
	I2C_SCL=0;
}
//发送应答是 主机给从机发送是否应答 主体只会是主机


/**
  * @brief  I2C接收应答位
  * @param  无
  * @retval 接收到的应答位，0为应答，1为非应答
  */ 
unsigned char I2C_ReceiveAck(void)
{
	unsigned char AckBit;
	I2C_SDA=1;  //先释放SDA,给从机控制，后面再根据应答情况，SDA会发生改变
	I2C_SCL=1;
	AckBit=I2C_SDA;  //拉高SCL后就开始读取数据
	I2C_SCL=0;
	return AckBit;  //返回值为0即有应答，返回值为1即无应答
}
//接受应答是 从机给主机发送是否应答 主体只会是从机
